#ifndef __SW_IIC_H
#define __SW_IIC_H
// #include "sys.h"
#include "stm32f1xx_ll_gpio.h"

// IO定义
#define SW_IIC_SDA_PIN                      LL_GPIO_PIN_0
#define SW_IIC_SDA_PORT                     GPIOB
#define SW_IIC_SCL_PIN                      LL_GPIO_PIN_1
#define SW_IIC_SCL_PORT                     GPIOB

// IO方向设置
#define SW_IIC_SDA_IN()                     LL_GPIO_SetPinMode(SW_IIC_SDA_PORT, SW_IIC_SDA_PIN, LL_GPIO_MODE_INPUT)
#define SW_IIC_SDA_OUT()                    LL_GPIO_SetPinMode(SW_IIC_SDA_PORT, SW_IIC_SDA_PIN, LL_GPIO_MODE_OUTPUT)

// IO操作函数
#define SW_IIC_SCL_SET(n)                   (n)?LL_GPIO_SetOutputPin(SW_IIC_SCL_PORT, SW_IIC_SCL_PIN):LL_GPIO_ResetOutputPin(SW_IIC_SCL_PORT, SW_IIC_SCL_PIN)
#define SW_IIC_SDA_SET(n)                   (n)?LL_GPIO_SetOutputPin(SW_IIC_SDA_PORT, SW_IIC_SDA_PIN):LL_GPIO_ResetOutputPin(SW_IIC_SDA_PORT, SW_IIC_SDA_PIN)
#define SW_IIC_SDA_GET_STATE()              LL_GPIO_IsInputPinSet(SW_IIC_SDA_PORT, SW_IIC_SDA_PIN)

#if 0
// IO方向设置
#define CT_SDA_IN()               \
    {                             \
        GPIOA->CRL &= 0XFFFFF0FF; \
        GPIOA->CRL |= 8 << 4 * 2; \
    }
#define CT_SDA_OUT()              \
    {                             \
        GPIOA->CRL &= 0XFFFFF0FF; \
        GPIOA->CRL |= 3 << 4 * 2; \
    }

// IO操作函数
#define CT_IIC_SCL PAout(0) // SCL
#define CT_IIC_SDA PAout(2) // SDA
#define CT_READ_SDA PAin(2) // 输入SDA
#endif

// IIC所有操作函数
void delay_us(uint32_t nus);
void SW_IIC_Init(void);                 // 初始化IIC的IO口
void SW_IIC_Start(void);                // 发送IIC开始信号
void SW_IIC_Stop(void);                 // 发送IIC停止信号
void SW_IIC_Send_Byte(uint8_t txd);          // IIC发送一个字节
uint8_t SW_IIC_Read_Byte(unsigned char ack); // IIC读取一个字节
uint8_t SW_IIC_Wait_Ack(void);               // IIC等待ACK信号
void SW_IIC_Ack(void);                  // IIC发送ACK信号
void SW_IIC_NAck(void);                 // IIC不发送ACK信号

#endif
